一默

January 25, 2011

入门级廉价家庭高清方案

Filed under: Hobby — admin @ 11:25 am

最近闲着没事突然想看高清,刚好赶着搬新家,1080P的电视也有了,于是开始做功课,也已经有了一个雏形,记录如下。

整个记录大致分成以下几部分:片源,下载机,播放器,视频显示,音频输出,音频播放。因为本人不太喜欢all in one的solution,于是乎每个部分大都有专用的设备

  • 片源

高清的来源有很多种,最直接的莫过于买蓝光碟片,一方面可以满足部分人的收藏喜好,另一方面片源的质量也是没得说的。不过一旦选了蓝光碟片,播放器也就基本定了,只能是蓝光机,PS3,或者支持蓝光光驱的高清播放器,而考虑到价格的问题,这种方案直接被我否决

没有蓝光碟片,另一种最直接的方式就是从网上下载了。众所周知在以前那个BT的时代,只要有足够的带宽,下载还是蛮方便的。不过不要紧,BT没了,咱还有PT(不熟悉PT的同学可以自己google),以现有国内的网络带宽,下载达到线速肯定是没问题的。不过像ADSL这种畸形的小水管,没有上传带宽的保证,想混大站还是要花点精力的

  • 下载机

既然选择了网络获取片源,一个24*7*365的下载机就很有必要了,特别是对于咱这种ADSL小水管,得时刻开着保证上传。下载机的选择也比较多,有人喜欢用路由器直接刷固件,有人喜欢用NAS,有人喜欢用HTPC,还有人喜欢用高清播放器自带的下载功能。不过原则上下载机需要具备的功能是:低功耗(毕竟是一直开机的),高稳定性(理由同左,搭建HTPC的同学可能要注意点)。路由器刷固件有个小缺点就是内存太小,不适合大量做种;HTPC本人不是很喜欢,抛开功耗不说,决定搞那么大个东西做下载太浪费了,而一旦加上播放功能又觉得功能没有独立开来,钱也是一个问题;NAS一直没有淘到便宜的,也被否决了。
幸好有朋友推荐了O2 Joggler(具体干什么的请看这里),这玩意真是神奇,1.33GHz Atom,512M RAM,触摸电容屏,功耗还不到10W,Perfect!灌了个debian在里面,还有点空间装个lighttpd,写点小东西远程控制rtorrent进行PT

价格:450米

  • 播放器

播放器在整个流程中担任着视频解码输出,音频输出(可解可不解,不解码就需要支持源码输出,让后端的解码器负责解码)。如果选择了网上下载的高清资源,最简单的就是去搞个高清播放器(有兴趣的朋友可以看这里),小巧,便宜,功耗低,功能专注,我喜欢
家里正在用的是美如画R5,价格:499米

外加一个500G的2.5寸移动硬盘,价格:412米

  • 视频显示,音频输出,音频播放

既然是介绍入门方案,一个支持1080P的液晶或者等离子电视就够了。对音频没有需求的同学可以直接用电视输出声音(比如只关注高清连续剧的,用功放,音箱也改善不大,因为目前电视剧基本都是两声道音频编码)。经常看电影大片想体验5.1或7.1的同学可以考虑入手次世代功放+音箱。用高清播放器HDMI接口接次世代功放源码输出,次世代功放负责解码并模拟输出到5.1音箱(对次世代有兴趣的可以看这里
价格参考:
Sharp 46 G100A: 5899米
天龙1311次世代功放: 1700米
JBL 200.5 5.1音箱:2700米

  • 总结

价格方面,抛开家里的电视不算(不玩高清电视还是要看的),如果不需要好的音频效果,前期投入是O2 Joggler(450)+2.5寸500G硬盘(419)+美如画R5(499)=1368米,需要好的音频效果加上功放(1700)+音箱(2700)=5768;后期投入主要是下载机的电费: 0W O2 Joggler + 5W移动硬盘)=15W/小时,如果有收藏癖的可能还要算上后期购买硬盘的价格

在整个部署的过程中,碰到过一些小小的问题,留着提个醒

  1. 为了实现播放下载两不误,家里采用的是播放器播放时直接通过局域网访问连在O2 Joggler上面的硬盘,播放的同时下载,想无线访问的同学注意了,54Mbps的带宽网络直接播放720P快速切换场面还是会卡的,1080P就更不用说了。考虑到11n无线网卡在播放器上的兼容性,奉劝还是采用有线连接,100Mbps的局域网已经足够
  2. 还是跟上面的有关,为了实现100Mbps的局域网访问,我在家里是把O2 Joggler跟R5接在无线路由器的两个LAN口,实际情况证明有些无线路由如果有大量数据在LAN交换的时候无线网络以及WAN口的数据访问会受到影响,反应出来就是PC这时候上网会受到影响,所以无线路由器也不能为了省米而随便搞一个,一分钱一分货
  3. 占位

April 18, 2010

Ubuntu 9.10 on T60

Filed under: Life — admin @ 1:15 pm

最近突发神经,在自己的T60上装了个Ubuntu,至于为什么会装linux,我也想不出什么具体的理由,装b应该占了大多数
既然装了就得折腾折腾,记下来折腾的东西便于以后翻:
1. 事实证明T60上面是没法搞定4G内存的,原因不是由于没有安装PAE内核,也不是CPU不支持PAE,而是主板不支持,害得我提心吊胆的升级了最新的BIOS还是搞不定。WindowXP上面是有工具可以认出来单独划为ramdisk用的,估计是绕过了BIOS,如果谁知道怎么在linux下面绕过BIOS的吱一声
2. 换掉了默认的ibus输入,改为使用scim,装好包后用命令im-switch -z en_US.UTF-8 -s scim设置一下就应该可以了
3. 把apt的source设置为mirrors.163.com上面的源
4. Wine版的QQ: http://tieba.baidu.com/f?kz=682260488
5. taobao跟支付宝的安全登录: http://blog.alipay.com/301.html
6. 电驴用amule,原因是她支持混淆协议
7. Thinkpad的中键(TrackPoint)模拟滑轮, 用xinput设置一下就好了,我是把
xinput set-int-prop "TPPS/2 IBM TrackPoint" "Evdev Wheel Emulation" 8 1
xinput set-int-prop "TPPS/2 IBM TrackPoint" "Evdev Wheel Emulation Button" 8 2

放到了~/.Xsession, 这样每次重启就自动设置了
8. 放一个可以查资料的网站:www.thinkwiki.org
9. 占位

一点声卡的资料

Filed under: Hobby — admin @ 12:38 pm

在网上找了点资料,总结一下:

现在用的pci声卡基本由三部分组成:DSP芯片、I/O控制芯片和Codec芯片。其中DSP扶着一些2D和3D的加速处理,I/O控制芯片负责输入输出控制,Codec负责数字和模拟信号的转换。

后来随着技术的进步,很多声卡将DSP和I/O控制芯片集成在一起了,后来随着CPU主频的上升,有的声卡没了DSP,DSP的工作通过软件交给CPU来做,后来很多I/O控制也集成在了主板的南桥芯片里面,所以就成了主板+CPU+一块Codec就可以出声了,也就是我们常见的板载声卡结构。

结构说完了,说说声卡的工作过程。系统将数字信号通过pci总线或者数字输入接口给声卡,声卡的I/O控制和DSP接受,处理,再传给Codec,Codec转换成模拟后输出。有些声卡还带运算放大芯片,类似我们常说的功放。

可以看出,声卡好首先要做到DSP输出的数字信号要好,其实这个本来不是一个问题,电脑本来就是处理数字信号的,主要是AC97标准规定48KHz采样输出,而常见的cd,mp3,ape都是44.1K采样,所以有个SRC(Sample Rate Convertor)过程,这里就是声卡要解决的关键,有些声卡由硬件解决SRC问题,就没什么好说的了。像Creative由软件进行转换就一直做得不尽如人意。而一般的专业级声卡由于不遵守AC97标准所以一般有两个晶振,分别对应44.1K和48K,所以也没有SRC问题

其次要解决的就是数模转换问题,有些声卡放弃使用集成D/A功能的Codec芯片,而是采用了单独的DAC芯片做D/A转换,目前采用的采样率指标一般为18bit和20bit居多,部分高档的使用了24bit的产品

最后就是声卡的电路设计和做工了,这个和主板显卡之类的东西差不多,什么用料啊,供电啊,防电磁干扰啊之类的,没有这些再好的DSP和DAC也没用

说说GoF模式中的行为模式2

Filed under: Tech — admin @ 12:35 pm

2.Visitor模式
当你把不同的对象比如说String,Float丢到Collection类后,对象都成为Object,
以后遍历的时候如何对不同对象采取不同的操作?if else判断instanceof是最蠢的
办法,visitor模式的想法就是对String,Float等每一个可访问的对象都实现一个
公共接口:
interface CommonOperation {
public void operation(){
}
}
class StringElement implements CommonOperation {
public void operation() {
//自己的操作
}
}

class FloatElement一样
这样遍历collection的时候就可以通过((CommonOperation)iterator.next()).ope
ration()进行操作了,不过这里的缺点是一旦StringElement一定下来,他的操作也
就定了,也就是说客户无法自己更改操作
于是增加一级抽象,引入Visitor接口:
interface Visitor {
public void visitStringElement();
public void visitFloatElement();
}

然后改写CommandOperation和StringElement:
interface CommonOperation {
public void operation(Visitor v){
}
}
class StringElement implements CommonOperation {
public void operation(Visitor v) {
v.visitStringElement();
}
}

这样一来,你要搞不同的操作就实现Visitor接口后在visitXXX方法中实现自己的操
作就可以了
这个模式告诉我们:如果你想对一些对象进行某些公共操作而不怕引进新的类,就
用interface进行抽象(好像有点绕口),其实这也是Command,Strategy,Template Method的思想

说说GoF模式中的行为模式6

Filed under: Tech — admin @ 12:34 pm

6.
CoR模式:
这个好理解,A,B,C,D都实现处理该请求的接口,来了请求后A先看自己能不能处理
,不能就
丢给下一个,下一个不能处理继续丢给下一个……

interface Request {
public void action();
}
class ACanHandleRequest {
public void action() {
}
}
interface Hanlder {
public void handle(Request request);
}
class A implement Handler {
private Handler nextHandler;
public void A(Handler next) {
this.nextHandler = next;
}
public void handle(Request req) {
if (req instanceof ACanHanleReqeust)
req.action();
else
next.handle(req);
}
}

责任链上的下一个Handler可以通过当前Handler的构造指定或是提供一个set方法指

Mediator模式:
中介,这个很形象,抽象一个中介者出来,负责所有相关对象的交互,比如A想要向
B借钱,A先向中介说我要向B借钱,中介找B借钱,然后把钱返回给A,B向A借钱一样

interface Mediator {
A向B借钱();
B向A借钱();
}
class A {
Mediator m;
向B借钱(Mediator m) {
m.A向B借钱();
}
}
class B {
Mediator m;
向A借钱(Mediator m) {
m.B向A借钱();
}
}

然后一个具体类实现Mediator接口实现两个借钱方法,这有点像数据库里面的多对多
关系要抽象出三个表来,变成两个一对多,消除冗余
Interpreter:
这个没看,平时也不用,主要用来对语言的分析,看着就头大……
State:
主要用于状态转换比较复杂的地方,比如现在如果是a->b->c->d四个状态的转换,
平时都是if状态是a,状态转成b,if状态是b,状态转成c,if状态是c,状态转成d,而State模式把这几个State封装成类,然后由统一的转换管理器管理:

interface State {
public void next(Manager m);
public void previouse(Manager m);
}
class AState implements State {
public void next(Manager m) {
m.setState(new XState());
}
public void previouse(Manager m) {
m.setState(new XState());
}

BState,CState,DState……一样

class Manager {
private State state;
public void setState(State state) {
this.state = state;
}
public void next() {
state.next();
}
public void previouse() {
state.previouse();
}
}

这样我们通过Manager设定一个初始的state,然后通过next,previous就可以进行
状态转换,而具体next,previous是哪个状态由具体的AState,BState等指定

说说GoF模式中的行为模式5

Filed under: Tech — admin @ 12:31 pm

5.Observer模式
这个java类库已经实现了框架,不过我觉得自己实现也很简单:

//对事件感兴趣就实现这个接口,里面的action方法是对该事件的处理过程

interface Listener {
public void action();
}

//这就是具体的事件产生类,通过notifyListeners通知对事件感兴趣的类

class EventProducer {
List list = new ArrayList();
public void addListener(Listener l) {
list.add(l);
}
public void notifyListeners() {
for(Iterator i = list.iterator();i.hasNext();i++)
i.action();
}
}

是不是感觉有点熟悉,嘿,Swing里面组件的事件通知原理就是这样子的,比如
JButton就是这里的EventProducer,ActionListener就是这里的Listener,我们对
点击Button事件感兴趣就实现ActionListener接口,写自己的actionPerform方法
(这里的action方法)如果EventProducer可以产生不同的Event怎么区别?那就在
Listener的action方法加一个Event参数:

interface Listener {
public void action(Event e);
}

这下子就和swing里面的没什么区别了,呵呵

说说GoF模式中的行为模式4

Filed under: Tech — admin @ 12:30 pm

4.Memento模式
这个我觉得也太简单了…………就是在内存中保存一份原来状态的copy,待实例修
改了状态后可以回到以前的状态,完全和面向对象没啥关系
class A {
private int n;
private class CopyOfA {
private int n;
public CopyOfA(A a) {
n = a;
}
}
public CopyOfA getCopy() {
return new CopyOfA(this);
}
public void setCopy(CopyOfA a) {
this.n = a.n;
}
}

看吧,就这么简单,你要保存对象状态的时候就getCopy(),啥时候要恢复就setCop
y()而且你也应该注意到了对不同的类都要撰写不同的CopyOfX,累~用的时候还导致内存的大量使用……

说说GoF模式中的行为模式3

Filed under: Tech — admin @ 12:20 pm

3.Iterator模式
这个虽然叫Iterator,不过更深一步看原理如下:
想要对类A,B,C,D实现一些公共操作,比如是push,pull,并不一定要在A,B,C,D中
实现push,pull,而是在A,B,C,D中实现一个方法:

class A {
……
public Operation getOperation() {
return new Operation(this);//呆会儿解释为什么要传this参数
}
……
}

这里的Operation是一个接口,里面放的就是A,B,C,D要实现的一些公共操作

interface Operation {
public void push();
public void pull();
}

然后写一个具体的操作类:

class ConcreteOperation Operation {
public ConcreteOperation(A a) {
this.a = a;
}
public void push() {
操作a
}
public void pull() {
操作a
}
}

需要留意的一点就是ConcreteOperation里面要有A的一个引用,因为iterator模式
的思想是把公共的操作分离到接口(这里的Operation),如果具体操作类里面没有
A的引用,如何操作?这也是A的getOperation方法要传this的原因.
这里我们看到了另外一种接口分离的方法,前面的Command模式之类的都是把公共操作放到一个公共接口,然后A,B,C,D要实现该接口,而这里是A,B,C,D返回实现接口的一个具体类,可以具体体会一下

说说GoF模式中的行为模式1

Filed under: Tech — admin @ 12:11 pm

看了一下午行为模式,说点自己的看法,不对的地方欢迎大家指正
GoF23种模式种行为模式有:
CoR,Command,Interpreter,Iterator,Mediator,Memento,Observer,State,Strateg
y,Template Method,Visitor
1.Command vs Strategy vs Template Method
这三个虽然叫法不同,不过从实现上都是通过abstract class或者interface进行隔
离,所以我觉得实际应用中具体没有什么区别:
interface AbstractOperation {
public void operation();
}
class ConcreteOperation1 implements AbstractOperation {
public void operation() {
自己的操作
}
}

ConcreteOperation2一样

Xserver Xclinet XDM,看了两天的howto文档

Filed under: Tech — admin @ 12:03 pm

对于linux启动后怎么进入图形界面一直不是很清楚,这两天拿着相关的资料狂看,总算入门了。

linux上面的图形界面一般是使用的X Window System,是采用的C/S的结构,有Xserver和Xclient之分,Xserver常用的就是free的XFree86,而我们平常用的图形界面下的程序就是client,如xterm,rxvt,firefox。Xserver负责的是管理机器上面的显示器,键盘,鼠标等输入输出设备,而client只是简单的告诉server要干什么,比如说你启动xterm的时候,就是在告诉server我要一个窗口,于是server就在屏幕上面画一个窗口(当然没这么简单,大致原理如此)。这种c/s得结构使得我们可以把Xserver和Xclien安装在不同的机器上面,后面可以看到。

搞清楚了server和client的关系后,再看看window manager(WM),xdm,xfce,gnome,kde之类的。WM只是负责管理窗口的,比如说最大化,最小化,窗口的重叠,怎么激活一个窗口,怎么把窗口放在最前面……WM也是一个clinet程序。xdm是X Display Manager的全称,简单来说就是图形版的login程序,负责显示图形登陆界面,当然不只是这个作用,还有个最主要的就是做为一个XDMCP的server。而xfce,gnome,kde则是一整套桌面系统(当然也全部是client),含有很多组件,比如说文件管理器,面板管理器等等,也包括wm和相应的xdm的实现。

下面来看看一般的图形界面是怎么启动起来的。一般来说,一个装用linux系统的电脑都会把Xserver和Xclient在一台机器上面启动。进入图形界面有两种方式:一种是先在文本方式下面login后用startx启动,startx会接着调用xinit,xinit主要干两件事情,用xserverrc脚本启动Xserver,用xinitrc脚本启动相应的client程序(最简单的就是启动一个xterm,或是启动一个wm,或是启动gnome,kde之类的DE);第二种方式就是系统启动后期直接运行xdm提示登陆界面(我们平时的常用方式),然后输入用户和密码后进入系统。用xdm的方式启动也是先启动Xserver后显示登陆界面(登陆界面也是图形界面,所以必须要启动Xserver先),验证用户后启动相应的client程序。

关于xdm的启动方式,想多说两句,平常基本都是用这种方式启动的。xdm的配置文件都在/etc/X11/xdm下面,xdm-config配置其他配置文件的位置,Xservers配置xdm启动的Xserver,Xaccess配置允许login的主机名。前面说过xdm的另外一个作用是可以作为XDMCP服务器,Xaccess就是配置这个权限的。由于平时我们都是把Xserver和xdm装在一台机器上面,所以没有什么感觉。其实我们可以用一台486的机器A只安装Xserver,甚至连硬盘都不用,专门负责显示(通常这叫X Terminal),而另外一台专门作运算的高档机器B上面安装xdm(不用安装Xserver),A可以通过XDMCP协议连接B的xdm程序,在A上面显示图形登陆界面,login之后在B上面运行程序,程序的界面则在A上面显示(因为A上面安装的是Xserver)。有人会问那岂不是每台安装Xserver的机器都可以连接B后显示登陆界面?xdm的Xaccess文件就是管这个的。这里要注意的是XDMCP不是一个安全协议,也就是说你通过A登陆B的过程中,所有的userid和password都是以明文传输的,这样很不安全,可以通过ssh的方式解决。

上面的东西都是linux howto上面看到的,具体就是X Window User Howto,X Window Overview Howto,Remote X Apps Howto,XDMCP Howto,XDM Xterm Howto…,可以在http://www.plinux.org/LDP/上面下到。

Older Posts »

Powered by WordPress